library(tidyverse)
── Attaching packages ─────────────────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──
✔ ggplot2 3.0.0     ✔ purrr   0.2.5
✔ tibble  1.4.2     ✔ dplyr   0.7.6
✔ tidyr   0.8.1     ✔ stringr 1.3.1
✔ readr   1.1.1     ✔ forcats 0.3.0
── Conflicts ────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()

Beyond the x and y aesthetics

Switch focus to exploring aesthetic mappings, instead of geoms.

Shapes

  • Try a scatterplot of gdpPercap vs pop with a categorical variable (continent) as shape.

  • As with all (?) aesthetics, we can also have them not as aesthetics!
    • Try some shapes: first as integer from 0-24, then as keyboard characters.
    • What’s up with pch?

List of shapes can be found at the bottom of the scale_shape documentation.

Colour

Make a scatterplot. Then:

  • Try colour as categorical variable.
  • Try colour and color.
  • Try colour as numeric variable.
    • Try trans="log10" for log scale.

Make a line plot of gdpPercap over time for all countries. Colour by lifeExp > 60 (remember that lifeExp looks bimodal?)

Try adding colour to a histogram. How is this different?

Facetting

Make histograms of gdpPercap for each continent. Try the scales and ncol arguments.

Remove Oceania. Add another variable: lifeExp > 60.

Bubble Plots

  • Add a size aesthetic to a scatterplot. What about cex?
  • Try adding scale_radius() and scale_size_area(). What’s better?
  • Use shape=21 to distinguish between fill (interior) and colour (exterior).

“Complete” plot

Let’s try plotting much of the data.

  • gdpPercap vs lifeExp with pop bubbles
  • facet by year
  • colour by continent

Continue from last time (geom exploration with x and y aesthetics)

Path plots

Let’s see how Rwanda’s life expectancy and GDP per capita have evolved over time, using a path plot.

  • Try geom_line(). Try geom_point().
  • Add arrow=arrow() option.
  • Add geom_text, with year label.

Two categorical variables

Try cyl (number of cylinders) ~ am (transmission) in the mtcars data frame.

  • Scatterplot? Jitterplot? No.
  • geom_count().
  • geom_bin2d(). Compare with geom_tile() with fill aes.

Overplotting

Try a scatterplot with:

  • Alpha transparency.
  • geom_hex()
  • geom_density2d()
  • geom_smooth()

Bar plots

How many countries are in each continent? Use the year 2007.

  1. After filtering the gapminder data to 2007, make a bar chart of the number of countries in each continent. Store everything except the geom in the variable d.

  1. Notice the y-axis. Oddly, ggplot2 doesn’t make it obvious how to change to proportion. Try adding a y aesthetic: y=..count../sum(..count..).

Uses of bar plots: Get a sense of relative quantities of categories, or see the probability mass function of a categorical random variable.

Polar coordinates

  • Add coord_polar() to a scatterplot.

Want more practice?

If you’d like some practice, give these exercises a try

Exercise 1: Make a plot of year (x) vs lifeExp (y), with points coloured by continent. Then, to that same plot, fit a straight regression line to each continent, without the error bars. If you can, try piping the data frame into the ggplot function.

Exercise 2: Repeat Exercise 1, but switch the regression line and geom_point layers. How is this plot different from that of Exercise 1?

Exercise 3: Omit the geom_point layer from either of the above two plots (it doesn’t matter which). Does the line still show up, even though the data aren’t shown? Why or why not?

Exercise 4: Make a plot of year (x) vs lifeExp (y), facetted by continent. Then, fit a smoother through the data for each continent, without the error bars. Choose a span that you feel is appropriate.

Exercise 5: Plot the population over time (year) using lines, so that each country has its own line. Colour by gdpPercap. Add alpha transparency to your liking.

Exercise 6: Add points to the plot in Exercise 5.

LS0tCnRpdGxlOiAiY20wMDcgRXhlcmNpc2VzOiBFeHBsb3JpbmcgQWVzdGhldGljIE1hcHBpbmdzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKZWRpdG9yX29wdGlvbnM6IAogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKLS0tCmBgYHtyfQpsaWJyYXJ5KGdhcG1pbmRlcikKbGlicmFyeSh0aWR5dmVyc2UpCmBgYAoKCgojIEJleW9uZCB0aGUgeCBhbmQgeSBhZXN0aGV0aWNzCgpTd2l0Y2ggZm9jdXMgdG8gZXhwbG9yaW5nIGFlc3RoZXRpYyBtYXBwaW5ncywgaW5zdGVhZCBvZiBnZW9tcy4gCgojIyBTaGFwZXMKCi0gVHJ5IGEgc2NhdHRlcnBsb3Qgb2YgYGdkcFBlcmNhcGAgdnMgYHBvcGAgd2l0aCBhIGNhdGVnb3JpY2FsIHZhcmlhYmxlIChjb250aW5lbnQpIGFzIGBzaGFwZWAuCgpgYGB7cn0KZ3ZzbCA8LSBnZ3Bsb3QoZ2FwbWluZGVyLCBhZXMoZ2RwUGVyY2FwLCBsaWZlRXhwKSkrCiAgc2NhbGVfeF9sb2cxMCgpCgpndnNsK2dlb21fcG9pbnQoYWVzKHNoYXBlID0gY29udGluZW50ICksIGFscGhhID0gMC4yKQpgYGAKCgoKCgotIEFzIHdpdGggYWxsICg/KSBhZXN0aGV0aWNzLCB3ZSBjYW4gYWxzbyBoYXZlIHRoZW0gX25vdF8gYXMgYWVzdGhldGljcyEKICAgIC0gVHJ5IHNvbWUgc2hhcGVzOiBmaXJzdCBhcyBpbnRlZ2VyIGZyb20gMC0yNCwgdGhlbiBhcyBrZXlib2FyZCBjaGFyYWN0ZXJzLgogICAgLSBXaGF0J3MgdXAgd2l0aCBgcGNoYD8KCmBgYHtyfQpndnNsK2dlb21fcG9pbnQoc2hhcGUgPSAyNCkKZ3ZzbCtnZW9tX3BvaW50KHBjaCA9IDI0KQoKZ3ZzbCtnZW9tX3BvaW50KHNoYXBlID0gIkAiKSAgIyBjYW4gdXNlIGtleWJvYXJkIHNpZ24gYXMgYSBzaGFwZSBpbnB1dApgYGAKCgpMaXN0IG9mIHNoYXBlcyBjYW4gYmUgZm91bmQgW2F0IHRoZSBib3R0b20gb2YgdGhlIGBzY2FsZV9zaGFwZWAgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9nZ3Bsb3QyLnRpZHl2ZXJzZS5vcmcvcmVmZXJlbmNlL3NjYWxlX3NoYXBlLmh0bWwpLgoKIyMgQ29sb3VyCgpNYWtlIGEgc2NhdHRlcnBsb3QuIFRoZW46CgotIFRyeSBjb2xvdXIgYXMgY2F0ZWdvcmljYWwgdmFyaWFibGUuCi0gVHJ5IGBjb2xvdXJgIGFuZCBgY29sb3JgLiAKLSBUcnkgY29sb3VyIGFzIG51bWVyaWMgdmFyaWFibGUuCiAgICAtIFRyeSBgdHJhbnM9ImxvZzEwImAgZm9yIGxvZyBzY2FsZS4KYGBge3J9Cmd2c2wrZ2VvbV9wb2ludChhZXMoY29sb3VyID0gY29udGluZW50KSkKYGBgCmBgYHtyfQpndnNsICsgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBwb3ApKQpgYGAKYGBge3J9Cmd2c2wrZ2VvbV9wb2ludChhZXMoY29sb3VyID0gcG9wKSkrc2NhbGVfY29sb3JfY29udGludW91cyh0cmFucyAgPSJsb2cxMCIpCmBgYAoKCk1ha2UgYSBsaW5lIHBsb3Qgb2YgYGdkcFBlcmNhcGAgb3ZlciB0aW1lIGZvciBhbGwgY291bnRyaWVzLiBDb2xvdXIgYnkgYGxpZmVFeHAgPiA2MGAgKHJlbWVtYmVyIHRoYXQgYGxpZmVFeHBgIGxvb2tzIGJpbW9kYWw/KQpgYGB7cn0KZ3ZzbCtnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBsaWZlRXhwPjYwKSkKCmBgYAoKClRyeSBhZGRpbmcgY29sb3VyIHRvIGEgaGlzdG9ncmFtLiBIb3cgaXMgdGhpcyBkaWZmZXJlbnQ/CmBgYHtyfQpnZ3Bsb3QoZ2FwbWluZGVyLGFlcyhsaWZlRXhwKSkrZ2VvbV9oaXN0b2dyYW0oYWVzKGZpbGwgPSBjb250aW5lbnQpKSAKYGBgCgoKIyMgRmFjZXR0aW5nCgpNYWtlIGhpc3RvZ3JhbXMgb2YgYGdkcFBlcmNhcGAgZm9yIGVhY2ggY29udGluZW50LiBUcnkgdGhlIGBzY2FsZXNgIGFuZCBgbmNvbGAgYXJndW1lbnRzLiAKYGBge3J9CmdncGxvdChnYXBtaW5kZXIsIGFlcyhsaWZlRXhwKSkrCiAgZmFjZXRfd3JhcCggfiBjb250aW5lbnQsIHNjYWxlcyA9ICJmcmVlX3giKStnZW9tX2hpc3RvZ3JhbSgpCmBgYAoKUmVtb3ZlIE9jZWFuaWEuIEFkZCBhbm90aGVyIHZhcmlhYmxlOiBgbGlmZUV4cCA+IDYwYC4gCmBgYHtyfQoKZ2dwbG90KGdhcG1pbmRlciwgYWVzKGdkcFBlcmNhcCkpKwogIGZhY2V0X2dyaWQoY29udGluZW50IH4gbGlmZUV4cCA+IDYwKSArCiAgZ2VvbV9oaXN0b2dyYW0oKQpgYGAKCgojIyBCdWJibGUgUGxvdHMKCi0gQWRkIGEgYHNpemVgIGFlc3RoZXRpYyB0byBhIHNjYXR0ZXJwbG90LiBXaGF0IGFib3V0IGBjZXhgPwotIFRyeSBhZGRpbmcgYHNjYWxlX3JhZGl1cygpYCBhbmQgYHNjYWxlX3NpemVfYXJlYSgpYC4gV2hhdCdzIGJldHRlcj8KLSBVc2UgYHNoYXBlPTIxYCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGBmaWxsYCAoaW50ZXJpb3IpIGFuZCBgY29sb3VyYCAoZXh0ZXJpb3IpLgpgYGB7cn0KZ3ZzbCtnZW9tX3BvaW50KGFlcyhzaXplID0gcG9wKSwgYWxwaGEgPTAuMikrCiAgc2NhbGVfc2l6ZV9hcmVhKCkKCmBgYApgYGB7cn0KZ3ZzbCtnZW9tX3BvaW50KGFlcyhzaXplID0gcG9wLCBmaWxsPSBjb250aW5lbnQpLCBzaGFwZSA9IDIxLCBjb2xvdXI9ICJibGFjayIpCmBgYAoKCiMjICJDb21wbGV0ZSIgcGxvdAoKTGV0J3MgdHJ5IHBsb3R0aW5nIG11Y2ggb2YgdGhlIGRhdGEuCgotIGdkcFBlcmNhcCB2cyBsaWZlRXhwIHdpdGggcG9wIGJ1YmJsZXMKLSBmYWNldCBieSB5ZWFyCi0gY29sb3VyIGJ5IGNvbnRpbmVudAoKYGBge3J9Cmd2c2wrZ2VvbV9wb2ludChhZXMoc2l6ZSA9IHBvcCwgY29sb3VyID0gY29udGluZW50KSkrCiAgc2NhbGVfc2l6ZV9hcmVhKCkrCiAgZmFjZXRfd3JhcCh+eWVhcikKYGBgCgoKIyBDb250aW51ZSBmcm9tIGxhc3QgdGltZSAoZ2VvbSBleHBsb3JhdGlvbiB3aXRoIGB4YCBhbmQgYHlgIGFlc3RoZXRpY3MpCgojIyBQYXRoIHBsb3RzCgpMZXQncyBzZWUgaG93IFJ3YW5kYSdzIGxpZmUgZXhwZWN0YW5jeSBhbmQgR0RQIHBlciBjYXBpdGEgaGF2ZSBldm9sdmVkIG92ZXIgdGltZSwgdXNpbmcgYSBwYXRoIHBsb3QuCgotIFRyeSBgZ2VvbV9saW5lKClgLiBUcnkgYGdlb21fcG9pbnQoKWAuCi0gQWRkIGBhcnJvdz1hcnJvdygpYCBvcHRpb24uCi0gQWRkIGBnZW9tX3RleHRgLCB3aXRoIHllYXIgbGFiZWwuIAoKYGBge3J9CmdhcG1pbmRlciU+JQogIGZpbHRlcihjb3VudHJ5ID09IlJ3YW5kYSIpJT4lCiAgZ2dwbG90KGFlcyhnZHBQZXJjYXAsbGlmZUV4cCkpKwogIGdlb21fcG9pbnQoKSsKICBnZW9tX3BhdGgoYXJyb3cgPSBhcnJvdygpKQpgYGAKCiMjIFR3byBjYXRlZ29yaWNhbCB2YXJpYWJsZXMKClRyeSBgY3lsYCAobnVtYmVyIG9mIGN5bGluZGVycykgfiBgYW1gICh0cmFuc21pc3Npb24pIGluIHRoZSBgbXRjYXJzYCBkYXRhIGZyYW1lLgoKLSBTY2F0dGVycGxvdD8gSml0dGVycGxvdD8gTm8uCi0gYGdlb21fY291bnQoKWAuCi0gYGdlb21fYmluMmQoKWAuIENvbXBhcmUgd2l0aCBgZ2VvbV90aWxlKClgIHdpdGggYGZpbGxgIGFlcy4KCmBgYHtyfQpnZ3Bsb3QobXRjYXJzLCBhZXMoY3lsLCBhbSkpKwogIGdlb21fY291bnQoKQoKZ2dwbG90KG10Y2FycywgYWVzKGZhY3RvcihjeWwpLCBmYWN0b3IoYW0pKSkrCiAgZ2VvbV9iaW4yZCgpCmBgYAoKCgoKIyMgT3ZlcnBsb3R0aW5nCgpUcnkgYSBzY2F0dGVycGxvdCB3aXRoOgoKLSBBbHBoYSB0cmFuc3BhcmVuY3kuCi0gYGdlb21faGV4KClgCi0gYGdlb21fZGVuc2l0eTJkKClgCi0gYGdlb21fc21vb3RoKClgCmBgYHtyfQpndnNsICsgZ2VvbV9oZXgoKQoKZ3ZzbCtnZW9tX2RlbnNpdHkyZCgpCgpndnNsK2dlb21fcG9pbnQoYWxwaGEgPSAwLjEpICsgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikKCmd2c2wrZ2VvbV9wb2ludCgpK2Nvb3JkX3BvbGFyKCkKYGBgCgoKIyMgQmFyIHBsb3RzCgpIb3cgbWFueSBjb3VudHJpZXMgYXJlIGluIGVhY2ggY29udGluZW50PyBVc2UgdGhlIHllYXIgMjAwNy4KCjEuIEFmdGVyIGZpbHRlcmluZyB0aGUgZ2FwbWluZGVyIGRhdGEgdG8gMjAwNywgbWFrZSBhIGJhciBjaGFydCBvZiB0aGUgbnVtYmVyIG9mIGNvdW50cmllcyBpbiBlYWNoIGNvbnRpbmVudC4gU3RvcmUgZXZlcnl0aGluZyBleGNlcHQgdGhlIGdlb20gaW4gdGhlIHZhcmlhYmxlIGBkYC4KYGBge3J9CmdhcG1pbmRlciAlPiUKICBmaWx0ZXIoeWVhciA9PTIwMDcpJT4lCiAgZ2dwbG90KGFlcyh4ID0gY29udGluZW50ICkpKwogIGdlb21fYmFyKCkKYGBgCgoKCjIuIE5vdGljZSB0aGUgeS1heGlzLiBPZGRseSwgYGdncGxvdDJgIGRvZXNuJ3QgbWFrZSBpdCBvYnZpb3VzIGhvdyB0byBjaGFuZ2UgdG8gcHJvcG9ydGlvbi4gVHJ5IGFkZGluZyBhIGB5YCBhZXN0aGV0aWM6IGB5PS4uY291bnQuLi9zdW0oLi5jb3VudC4uKWAuCgoKCl9fVXNlcyBvZiBiYXIgcGxvdHNfXzogR2V0IGEgc2Vuc2Ugb2YgcmVsYXRpdmUgcXVhbnRpdGllcyBvZiBjYXRlZ29yaWVzLCBvciBzZWUgdGhlIHByb2JhYmlsaXR5IG1hc3MgZnVuY3Rpb24gb2YgYSBjYXRlZ29yaWNhbCByYW5kb20gdmFyaWFibGUuCgoKCiMjIFBvbGFyIGNvb3JkaW5hdGVzCgotIEFkZCBgY29vcmRfcG9sYXIoKWAgdG8gYSBzY2F0dGVycGxvdC4KCgojIFdhbnQgbW9yZSBwcmFjdGljZT8KCklmIHlvdSdkIGxpa2Ugc29tZSBwcmFjdGljZSwgZ2l2ZSB0aGVzZSBleGVyY2lzZXMgYSB0cnkKCl9fRXhlcmNpc2UgMV9fOiBNYWtlIGEgcGxvdCBvZiBgeWVhcmAgKHgpIHZzIGBsaWZlRXhwYCAoeSksIHdpdGggcG9pbnRzIGNvbG91cmVkIGJ5IGNvbnRpbmVudC4gVGhlbiwgdG8gdGhhdCBzYW1lIHBsb3QsIGZpdCBhIHN0cmFpZ2h0IHJlZ3Jlc3Npb24gbGluZSB0byBlYWNoIGNvbnRpbmVudCwgd2l0aG91dCB0aGUgZXJyb3IgYmFycy4gSWYgeW91IGNhbiwgdHJ5IHBpcGluZyB0aGUgZGF0YSBmcmFtZSBpbnRvIHRoZSBgZ2dwbG90YCBmdW5jdGlvbi4KCl9fRXhlcmNpc2UgMl9fOiBSZXBlYXQgRXhlcmNpc2UgMSwgYnV0IHN3aXRjaCB0aGUgX3JlZ3Jlc3Npb24gbGluZV8gYW5kIF9nZW9tXF9wb2ludF8gbGF5ZXJzLiBIb3cgaXMgdGhpcyBwbG90IGRpZmZlcmVudCBmcm9tIHRoYXQgb2YgRXhlcmNpc2UgMT8KCl9fRXhlcmNpc2UgM19fOiBPbWl0IHRoZSBgZ2VvbV9wb2ludGAgbGF5ZXIgZnJvbSBlaXRoZXIgb2YgdGhlIGFib3ZlIHR3byBwbG90cyAoaXQgZG9lc24ndCBtYXR0ZXIgd2hpY2gpLiBEb2VzIHRoZSBsaW5lIHN0aWxsIHNob3cgdXAsIGV2ZW4gdGhvdWdoIHRoZSBkYXRhIGFyZW4ndCBzaG93bj8gV2h5IG9yIHdoeSBub3Q/CgpfX0V4ZXJjaXNlIDRfXzogTWFrZSBhIHBsb3Qgb2YgYHllYXJgICh4KSB2cyBgbGlmZUV4cGAgKHkpLCBmYWNldHRlZCBieSBjb250aW5lbnQuIFRoZW4sIGZpdCBhIHNtb290aGVyIHRocm91Z2ggdGhlIGRhdGEgZm9yIGVhY2ggY29udGluZW50LCB3aXRob3V0IHRoZSBlcnJvciBiYXJzLiBDaG9vc2UgYSBzcGFuIHRoYXQgeW91IGZlZWwgaXMgYXBwcm9wcmlhdGUuCgpfX0V4ZXJjaXNlIDVfXzogUGxvdCB0aGUgcG9wdWxhdGlvbiBvdmVyIHRpbWUgKHllYXIpIHVzaW5nIGxpbmVzLCBzbyB0aGF0IGVhY2ggY291bnRyeSBoYXMgaXRzIG93biBsaW5lLiBDb2xvdXIgYnkgYGdkcFBlcmNhcGAuIEFkZCBhbHBoYSB0cmFuc3BhcmVuY3kgdG8geW91ciBsaWtpbmcuIAoKX19FeGVyY2lzZSA2X186IEFkZCBwb2ludHMgdG8gdGhlIHBsb3QgaW4gRXhlcmNpc2UgNS4=